package jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

/**
 * 预编译SQL语句
 * 预编译SQL语句是将数值可以先用"?"占位,然后将其发送给数据库将语义固定.
 * 之后再将需要的数值发送给数据库来进行执行,避免拼接SQL语句导致语义改变的SQL注入攻击问题
 *
 * 开发中只要发生要将用户输入信息体现到SQL语句中的情况,就应当使用预编译SQL
 * 只有静态SQL才用Statement
 */
public class JDBCDemo6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("欢迎登录");
        System.out.println("请输入用户名");
        String username = scanner.nextLine();
        System.out.println("请输入密码");
        String password = scanner.nextLine();

        try (Connection connection = DBUtil.getConnection();){
            String sql = "SELECT id,username,password,nickname,age " +
                         "FROM userinfo " +
                         "WHERE username=? AND password=?";
            //创建PreparedStatement时就已经将预编译SQL与发送给数据库了
            PreparedStatement ps = connection.prepareStatement(sql);
            //通过PS为?指定对应的值
            ps.setString(1,username);
            ps.setString(2,password);
            ResultSet rs = ps.executeQuery();//不必再发送SQL语句了
            if(rs.next()){
                System.out.println("登录成功,欢迎回来:"+rs.getString("nickname"));
            }else{
                System.out.println("登录失败,用户名或密码错误");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}








